home *** CD-ROM | disk | FTP | other *** search
- {
- >Now I need a fast way of generating random numbers in Gaussian Distribution
-
- This is my code for gaussian and uniform distribution.
- After the unit there is a graphic test program.
-
- From: randyd@alpha2.csd.uwm.edu (Randall Elton Ding)
- }
-
- unit rndgauss;
-
-
- interface
-
-
- function rnd: double; { returns uniform [0..1] }
-
- function gauss(a,d: double): double; { a is mean, d is std deviation }
-
-
- implementation
-
-
- function rnd: double;
- const
- bias = 1023;
-
- var
- data: record
- b: byte;
- d: double;
- end;
- x: array[0..8] of byte absolute data;
- e,i,j: word;
-
- begin
- for i:= 0 to 7 do x[i]:= lo(random(256));
- e:= bias;
- repeat
- j:= 0;
- for i:= 0 to 7 do begin
- j:= (x[i] shl 1) + hi(j);
- x[i]:= lo(j);
- end;
- e:= e-1;
- if (bias-e) mod 8 = 0 then x[0]:= lo(random(256));
- until (x[7] and $10) = $10;
- x[7]:= (x[7] and $0F) or lo(e shl 4);
- x[8]:= lo(e shr 4);
- rnd:= data.d;
- end;
-
-
-
- function gauss(a,d: double): double;
- const
- t: double = 0;
-
- var
- v1,v2,r: double;
-
- begin
- if t=0 then begin
- repeat
- v1:= 2*rnd-1;
- v2:= 2*rnd-1;
- r:= v1*v1+v2*v2
- until r<1;
- r:= sqrt((-2*ln(r))/r);
- t:= v2*r;
- gauss:= a+v1*r*d;
- end
- else begin
- gauss:= a+t*d;
- t:= 0;
- end;
- end;
-
-
-
- begin
- end.
-
-
- {---------------------- cut ---------------------------------}
-
-
- program gaussiantest;
-
- uses crt,graph,rndgauss;
-
- const
- bgipath = 'c:\bp\bgi';
- largestx = 999;
-
-
- procedure testplot;
- var
- htarry: array[0..largestx] of integer;
- x,y,w,h,m,v: word;
-
- begin
- fillchar(htarry,sizeof(htarry),#0);
- w:= getmaxx+1;
- h:= getmaxy;
- m:= getmaxx div 2;
- v:= getmaxx div 8;
- while not keypressed do begin
- x:= trunc(gauss(m,v));
- if x<=largestx then begin
- y:= htarry[x];
- if y<=h then begin
- putpixel(x,h-y,white);
- htarry[x]:= y+1;
- end;
- end;
- end;
- end;
-
-
-
- procedure initbgi;
- var errcode,grmode,grdriver: integer;
- begin
- grdriver:= detect;
- initgraph (grdriver,grmode,bgipath);
- errcode:= graphresult;
- if errcode <> grok then begin
- writeln ('Graphics error: ',grapherrormsg (errcode));
- halt (1);
- end;
- end;
-
-
-
- begin
- initbgi;
- testplot;
- closegraph;
- end.
-